home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1997 May
/
EnigmA AMIGA RUN 18 (1997)(G.R. Edizioni)(IT)[!][issue 1997-05][EAR-CD II].iso
/
recent2
/
qamitrack1.80.lha
/
QAmiTrack
/
source
/
QAmiTrackShared.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-04-06
|
8KB
|
275 lines
/* AmiTrackShared.c -- Shared functions between client and server */
#define __DICE_C
#define __stdargs
#include "QAmiTrackShared.h"
#include "TrackRexx.h"
#include <devices/timer.h>
extern struct Library * IntuitionBase;
struct Library * TimerBase = NULL;
static ULONG trackFlags = 0L;
void TrackExit(char * szMessage, int nCode)
{
if (nCode > 0)
{
char temp[300];
sprintf(temp, "Exiting, code %i: [%s]",nCode, szMessage);
printf("%s\n",temp);
if (IntuitionBase) MakeReq("QAmiTrack Exiting Due to Error", temp, "Okay");
}
exit(nCode);
}
void SetTrackFlag(ULONG flag)
{
trackFlags |= flag;
}
BOOL CheckTrackFlag(ULONG flag)
{
BOOL ret = ((trackFlags & flag) != 0L);
trackFlags &= ~flag;
return(ret);
}
BOOL TrackFlagsSet()
{
return(trackFlags != 0L);
}
/* Wait for incoming packets or other relevant events */
/* Returns a chord of event codes. May exit if a CTRL-C is detected. */
void TrackWait(struct WindowStuff * Window, struct QSession * session, struct RexxHost * host, struct CxStuff * cx, struct TimerStuff * ts)
{
ULONG ulMask =
(Window ? (1L<<Window->win->UserPort->mp_SigBit) : 0L) |
(session ? (1L<<session->qMsgPort->mp_SigBit) : 0L) |
(host ? (1L<<host->port->mp_SigBit) : 0L) |
(cx ? (1L<<cx->port->mp_SigBit) : 0L) |
(ts ? (1L<<ts->TimerMP->mp_SigBit) : 0L) |
SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_D | SIGBREAKF_CTRL_E | SIGBREAKF_CTRL_F;
ulMask = Wait(ulMask);
if (ulMask & SIGBREAKF_CTRL_C) SetTrackFlag(CODE_QUIT);
if (ulMask & SIGBREAKF_CTRL_D) SetTrackFlag(CODE_TIMER);
if (ulMask & SIGBREAKF_CTRL_E) SetTrackFlag(CODE_HIDE);
if (ulMask & SIGBREAKF_CTRL_F) SetTrackFlag(CODE_SHOW);
if ((ts)&&(ulMask & (1L<<ts->TimerMP->mp_SigBit))) SetTrackFlag(CODE_TIMER);
if ((Window)&&(ulMask & (1L<<Window->win->UserPort->mp_SigBit))) SetTrackFlag(CODE_WINDOW_EVENT);
if ((session)&&(ulMask & (1L<<session->qMsgPort->mp_SigBit))) SetTrackFlag(CODE_QMESSAGE);
if ((host)&&(ulMask & (1L<<host->port->mp_SigBit))) SetTrackFlag(CODE_AREXX);
if ((cx)&&(ulMask & (1L << cx->port->mp_SigBit)))
{
CxMsg * msg;
while (msg = (CxMsg *) GetMsg(cx->port))
{
ULONG msgid = CxMsgID(msg);
ULONG msgtype = CxMsgType(msg);
ReplyMsg((struct Message *) msg);
if (msgtype == CXM_COMMAND)
{
switch(msgid)
{
case CXCMD_DISABLE: SetTrackFlag(CODE_DISABLE); break;
case CXCMD_ENABLE: SetTrackFlag(CODE_ENABLE); break;
case CXCMD_DISAPPEAR: SetTrackFlag(CODE_HIDE); break;
case CXCMD_UNIQUE: /* drop through to... */
case CXCMD_APPEAR: SetTrackFlag(CODE_SHOW); break;
case CXCMD_KILL: SetTrackFlag(CODE_QUIT); break;
}
}
else if (msgtype == CXM_IEVENT)
{
switch(msgid)
{
case EVT_HOTKEY: SetTrackFlag(CODE_SHOW); break;
default: printf("Warning: I'm getting unknown CxEvents!\n");
}
}
else printf("warning: I'm getting uncalled for CxMessages!\n");
}
}
}
/* if ts is NULL, allocates and returns all the TimerStuff you need (or NULL on failure) */
/* If ts is non-NULL, frees everything in ts, and returns NULL. */
struct TimerStuff * SetupTimer(struct TimerStuff * ts)
{
#ifdef __DICE_C
/* DICE seems to have a bug in it that makes it require this...
otherwise tv_secs and tv_micro aren't recognized! :( */
struct timeval {
ULONG tv_secs;
ULONG tv_micro;
};
#endif
if (ts)
{
/* Deallocate everything! */
if (ts->TimerIO)
{
if (ts->BDevOpen)
{
if (!(CheckIO((struct IORequest *)ts->TimerIO)))
{
AbortIO((struct IORequest *)ts->TimerIO); /* Ask device to abort any pending requests */
WaitIO((struct IORequest *)ts->TimerIO); /* proceed when ready */
}
CloseDevice((struct IORequest *) ts->TimerIO);
}
DeleteExtIO((struct IORequest *) ts->TimerIO);
}
if (ts->TimerMP) DeletePort(ts->TimerMP);
FreeMem(ts, sizeof(struct TimerStuff));
return(NULL);
}
else
{
/* Set up the timer.device */
UNLESS(ts = AllocMem(sizeof(struct TimerStuff), MEMF_CLEAR)) return(NULL);
UNLESS((ts->TimerMP = CreatePort(0,0))
&& (ts->TimerIO = (struct timerequest *) CreateExtIO(ts->TimerMP, (sizeof (struct timerequest))))
&& (ts->BDevOpen = (0 == OpenDevice(TIMERNAME,UNIT_VBLANK,(struct IORequest *)ts->TimerIO,0))))
return(SetupTimer(ts));
TimerBase = (struct Library *) ts->TimerIO->tr_node.io_Device;
ts->TimerIO->tr_node.io_Message.mn_ReplyPort = ts->TimerMP;
ts->TimerIO->tr_node.io_Command = TR_ADDREQUEST;
ts->TimerIO->tr_node.io_Flags = 0;
ts->TimerIO->tr_node.io_Error = 0;
ts->TimerIO->tr_time.tv_secs = 0;
ts->TimerIO->tr_time.tv_micro = 0;
return(ts);
}
}
int MakeReq(char *sTitle, char *sText, char *sGadgets)
{
struct EasyStruct myreq;
int nResult;
UNLESS(sTitle) sTitle = "QAmiTrack Message";
UNLESS(sText) sText = "Check this out!";
UNLESS(sGadgets) sGadgets = "OK";
myreq.es_TextFormat = sText;
myreq.es_Title = sTitle;
myreq.es_GadgetFormat = sGadgets;
nResult = EasyRequest(NULL, &myreq, NULL, NULL, NULL);
return(nResult);
}
/* Returns a pointer to the first non-space character in the string */
char * PastSpaces(char * pcString)
{
while(1)
{
if (*pcString == ' ') pcString++;
else return(pcString);
}
}
/* Chops off any trailing blanks and returns the string */
char * RemoveTrailingSpaces(char * pcString)
{
char * pcTemp = strchr(pcString,'\0');
pcTemp--;
while((pcTemp > pcString)&&(*pcTemp == ' ')) pcTemp--;
pcTemp++;
*pcTemp = '\0';
return(pcTemp);
}
/* Replaces all unprintable characters in pcString with ' ' */
/* Hopefully this will stop people from sending e.g. "talkbombs" */
/* Returns pcString. */
char * RemoveUnprintableChars(char * pcString)
{
UBYTE * pcTemp = pcString;
while(*pcTemp)
{
if (*pcTemp < ' ') *pcTemp = ' ';
pcTemp++;
}
return(pcString);
}
/* Makes pcString lower case */
char * ToLower(char * pcString)
{
char * pcTemp = pcString;
while(*pcTemp)
{
if ((*pcTemp >= 'A')&&(*pcTemp <= 'Z'))
*pcTemp += 'a'-'A';
pcTemp++;
}
return(pcString);
}
/* Deallocate the old string, allocate the new string! */
/* Give it a pointer to the pointer to the old string, and a pointer to the new string */
/* Can also server to just deallocate the old, if the new string is NULL */
void ReplaceAllocedString(char ** szOldString, char * szNewString)
{
char * pcTemp = NULL;
UNLESS(szOldString) return;
if (szNewString)
{
UNLESS(pcTemp = AllocMem(strlen(szNewString)+1, MEMF_ANY)) return;
strcpy(pcTemp, szNewString);
}
if (*szOldString) FreeMem(*szOldString, strlen(*szOldString)+1);
*szOldString = pcTemp;
return;
}
/* Set/Reset timer.device to signal us in nSecs seconds + nMicros microseconds */
void SetTimer(struct TimerStuff * ts, int nSecs, int nMicros)
{
/* First make sure there is no previous timer pending */
if (!(CheckIO((struct IORequest *) ts->TimerIO)))
{
return; /* Just ignore new request then */
/* This way seems bugged! */
/* AbortIO((struct IORequest *) ts->TimerIO); */
/* WaitIO((struct IORequest *) ts->TimerIO); */
}
ts->TimerIO->tr_time.tv_secs = nSecs;
ts->TimerIO->tr_time.tv_micro = nMicros;
/* Start ze timer */
if ((nSecs > 0)||(nMicros > 0)) SendIO((struct IORequest *)ts->TimerIO);
}